home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 34 / Amiga Format CD34 (1998-11-20)(Future Publishing)(GB)[!][Christmas issue].iso / -seriously_amiga- / programming / basic / blitzc2p / c2p / c2p040pluscls.ascii < prev    next >
Text File  |  1998-10-01  |  8KB  |  468 lines

  1. WBStartup
  2. NoCli
  3.  
  4. ; CLEARSCREEN version. Additional code by Paul West.
  5.  
  6. ; Non-clearscreen results:
  7.  
  8. ; 040/25 results:
  9.  
  10. ; 320x200 @46fps DoublePAL or 49.2fps PAL
  11. ; 320x256 @34.2fps DoublePAL or 37.9fps PAL
  12. ; 320x240 @37fps DoublePAL or 40.6fps PAL
  13.  
  14. ; 060/50 results:
  15.  
  16. ; 320x256 @50fps PAL
  17. ; 320x200 @66fps PAL
  18.  
  19. #c2pBPLX=320
  20. #c2pBPLY=256
  21. #c2pBPLSIZE=(#c2pBPLX*#c2pBPLY)/8
  22.  
  23. #scrwidth=#c2pBPLX
  24. #scrheight=#c2pBPLY
  25. #screensize=#scrwidth*#scrheight
  26.  
  27. #clearscreento=$00000000
  28.  
  29. ; Date: 20-Jan-1998     Mikael Kalms (Scout/C-Lous & more)
  30. ;         Email: mikael@kalms.org
  31. ;
  32. ; About:
  33. ;   1x1 8bpl cpu5 C2P for contigous bitplanes and no horizontal modulo
  34. ;
  35. ;   This routine is intended for use on all 68040 and 68060 based systems.
  36. ;   It is not designed to perform well on 68020-030.
  37. ;
  38. ;   This routine is released into the public domain. It may be freely used
  39. ;   for non-commercial as well as commercial purposes. A short notice via
  40. ;   email is always appreciated, though.
  41. ;
  42. ; Timings:
  43. ;   ~130% on (a1200 Blizzard) 040-25
  44. ;   Estimated to run at copyspeed on 040-40 and 060
  45. ;
  46. ; Features:
  47. ;   Performs CPU-only C2P conversion using rather state-of-the-art (as of
  48. ;   the creation date, anyway) techniques
  49. ;   Handles bitplanes creens of virtually any size (4GB)
  50. ;
  51. ; Restrictions:
  52. ;   Chunky-buffer must be an even multiple of 32 pixels wide
  53. ;   If incorrect/invalid parameters are specified, the routine will
  54. ;   most probably crash.
  55. ;
  56. ; c2p1x1_8_c5_040_init      sets only the chunkybuffer size/pos
  57. ; c2p1x1_8_c5_040     performs the actual c2p conversion
  58. ;
  59.  
  60. Statement c2p040init{A.l,B.l}
  61.  
  62.   ;A.l=d0=Width.w
  63.   ;B.l=d1=Height.w
  64.  
  65. ; d0.w  chunkyx [chunky-pixels]
  66. ; d1.w  chunkyy [chunky-pixels]
  67. ; d3.w  scroffsy [screen-pixels]
  68.  
  69.   MOVEQ.l #0,d3 ; Y offset
  70.  
  71. _c2p1x1_8_c5_040_init
  72.   MULU.w  d0,d3
  73.   LSR.l #3,d3
  74.   MOVE.l  d3,c2p1x1_8_c5_040_scroffs
  75.   MULU.w  d0,d1
  76.   MOVE.l  d1,c2p1x1_8_c5_040_pixels
  77. AsmExit
  78. End Statement
  79.  
  80. Statement c2p040{A.l,B.l}
  81.  
  82.   MOVE.l  d0,a0 ; Chunky
  83.   MOVE.l  d1,a1 ; Planar
  84.  
  85. ; a0  c2pscreen
  86. ; a1  bitplanes
  87. #_LVOCacheClearU=-$27C
  88. #execbase=$4
  89. _c2p1x1_8_c5_040
  90.   MOVEM.l a3-a6,-(a7)
  91.   MOVE.l  a7,stackstore
  92.   MOVE.l  #clearscreento,a7
  93.   ADD.l #c2pBPLSIZE*7,a1
  94.   ADD.l c2p1x1_8_c5_040_scroffs,a1
  95.  
  96.   MOVE.l  c2p1x1_8_c5_040_pixels,a2
  97.   MOVE.l  a2,d0 ; byPWest
  98.   TST.l d0 ;
  99.   BEQ _none
  100.   ADD.l a0,a2
  101.  
  102.   MOVE.l  (a0),d0
  103.   MOVE.l  a7,(a0)+
  104.   MOVE.l  (a0),d1
  105.   MOVE.l  a7,(a0)+
  106.   MOVE.l  (a0),d2
  107.   MOVE.l  a7,(a0)+
  108.   MOVE.l  (a0),d3
  109.   MOVE.l  a7,(a0)+
  110.   MOVE.l  (a0),d4
  111.   MOVE.l  a7,(a0)+
  112.   MOVE.l  (a0),d5
  113.   MOVE.l  a7,(a0)+
  114.   MOVE.l  (a0),a5
  115.   MOVE.l  a7,(a0)+
  116.   MOVE.l  (a0),a6
  117.   MOVE.l  a7,(a0)+
  118.  
  119.   SWAP  d4      ; Swap 16x4, part 1
  120.   SWAP  d5
  121.   EOR.w d0,d4
  122.   EOR.w d1,d5
  123.   EOR.w d4,d0
  124.   EOR.w d5,d1
  125.   EOR.w d0,d4
  126.   EOR.w d1,d5
  127.   SWAP  d4
  128.   SWAP  d5
  129.  
  130.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  131.   MOVE.l  d5,d7
  132.   LSR.l #2,d6
  133.   LSR.l #2,d7
  134.   EOR.l d0,d6
  135.   EOR.l d1,d7
  136.   AND.l #$33333333,d6
  137.   AND.l #$33333333,d7
  138.   EOR.l d6,d0
  139.   EOR.l d7,d1
  140.   LSL.l #2,d6
  141.   LSL.l #2,d7
  142.   EOR.l d6,d4
  143.   EOR.l d7,d5
  144.  
  145.   EXG d4,a5
  146.   EXG d5,a6
  147.  
  148.   SWAP  d4      ; Swap 16x4, part 2
  149.   SWAP  d5
  150.   EOR.w d2,d4
  151.   EOR.w d3,d5
  152.   EOR.w d4,d2
  153.   EOR.w d5,d3
  154.   EOR.w d2,d4
  155.   EOR.w d3,d5
  156.   SWAP  d4
  157.   SWAP  d5
  158.  
  159.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  160.   MOVE.l  d5,d7
  161.   LSR.l #2,d6
  162.   LSR.l #2,d7
  163.   EOR.l d2,d6
  164.   EOR.l d3,d7
  165.   AND.l #$33333333,d6
  166.   AND.l #$33333333,d7
  167.   EOR.l d6,d2
  168.   EOR.l d7,d3
  169.   LSL.l #2,d6
  170.   LSL.l #2,d7
  171.   EOR.l d6,d4
  172.   EOR.l d7,d5
  173.  
  174.   MOVE.l  d1,d6     ; Swap 4x1, part 1
  175.   MOVE.l  d3,d7
  176.   LSR.l #4,d6
  177.   LSR.l #4,d7
  178.   EOR.l d0,d6
  179.   EOR.l d2,d7
  180.   AND.l #$0f0f0f0f,d6
  181.   AND.l #$0f0f0f0f,d7
  182.   EOR.l d6,d0
  183.   EOR.l d7,d2
  184.   LSL.l #4,d6
  185.   LSL.l #4,d7
  186.   EOR.l d6,d1
  187.   EOR.l d7,d3
  188.  
  189.   BRA _start
  190.  
  191.   Even8
  192.   Even8
  193. _x
  194.   MOVE.l  (a0),d0
  195.   MOVE.l  a7,(a0)+
  196.   MOVE.l  (a0),d1
  197.   MOVE.l  a7,(a0)+
  198.   MOVE.l  (a0),d2
  199.   MOVE.l  a7,(a0)+
  200.   MOVE.l  (a0),d3
  201.   MOVE.l  a7,(a0)+
  202.   MOVE.l  (a0),d4
  203.   MOVE.l  a7,(a0)+
  204.   MOVE.l  (a0),d5
  205.   MOVE.l  a7,(a0)+
  206.   MOVE.l  (a0),a5
  207.   MOVE.l  a7,(a0)+
  208.   MOVE.l  (a0),a6
  209.   MOVE.l  a7,(a0)+
  210.  
  211.   MOVE.l  d6,(a1)
  212.   SUB.l #c2pBPLSIZE*4,a1
  213.  
  214.   SWAP  d4      ; Swap 16x4, part 1
  215.   SWAP  d5
  216.   EOR.w d0,d4
  217.   EOR.w d1,d5
  218.   EOR.w d4,d0
  219.   EOR.w d5,d1
  220.   EOR.w d0,d4
  221.   EOR.w d1,d5
  222.   SWAP  d4
  223.   SWAP  d5
  224.  
  225.   MOVE.l  d7,(a1)
  226.   ADD.l #c2pBPLSIZE*3,a1
  227.  
  228.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  229.   MOVE.l  d5,d7
  230.   LSR.l #2,d6
  231.   LSR.l #2,d7
  232.   EOR.l d0,d6
  233.   EOR.l d1,d7
  234.   AND.l #$33333333,d6
  235.   AND.l #$33333333,d7
  236.   EOR.l d6,d0
  237.   EOR.l d7,d1
  238.   LSL.l #2,d6
  239.   LSL.l #2,d7
  240.   EOR.l d6,d4
  241.   EOR.l d7,d5
  242.  
  243.   EXG d4,a5
  244.   EXG d5,a6
  245.  
  246.   SWAP  d4      ; Swap 16x4, part 2
  247.   SWAP  d5
  248.   EOR.w d2,d4
  249.   EOR.w d3,d5
  250.   EOR.w d4,d2
  251.   EOR.w d5,d3
  252.   EOR.w d2,d4
  253.   EOR.w d3,d5
  254.   SWAP  d4
  255.   SWAP  d5
  256.  
  257.   MOVE.l  a3,(a1)
  258.   SUB.l #c2pBPLSIZE*4,a1
  259.  
  260.   MOVE.l  d4,d6     ; Swap 2x4, part 1
  261.   MOVE.l  d5,d7
  262.   LSR.l #2,d6
  263.   LSR.l #2,d7
  264.   EOR.l d2,d6
  265.   EOR.l d3,d7
  266.   AND.l #$33333333,d6
  267.   AND.l #$33333333,d7
  268.   EOR.l d6,d2
  269.   EOR.l d7,d3
  270.   LSL.l #2,d6
  271.   LSL.l #2,d7
  272.   EOR.l d6,d4
  273.   EOR.l d7,d5
  274.  
  275.   MOVE.l  d1,d6     ; Swap 4x1, part 1
  276.   MOVE.l  d3,d7
  277.   LSR.l #4,d6
  278.   LSR.l #4,d7
  279.   EOR.l d0,d6
  280.   EOR.l d2,d7
  281.   AND.l #$0f0f0f0f,d6
  282.   AND.l #$0f0f0f0f,d7
  283.   EOR.l d6,d0
  284.   EOR.l d7,d2
  285.   LSL.l #4,d6
  286.   LSL.l #4,d7
  287.   EOR.l d6,d1
  288.   EOR.l d7,d3
  289.  
  290.   MOVE.l  a4,(a1)
  291.   ADD.l #c2pBPLSIZE*7+4,a1
  292.  
  293. _start
  294.   MOVE.l  d2,d6     ; Swap 8x2, part 1
  295.   MOVE.l  d3,d7
  296.   LSR.l #8,d6
  297.   LSR.l #8,d7
  298.   EOR.l d0,d6
  299.   EOR.l d1,d7
  300.   AND.l #$00ff00ff,d6
  301.   AND.l #$00ff00ff,d7
  302.   EOR.l d6,d0
  303.   EOR.l d7,d1
  304.   LSL.l #8,d6
  305.   LSL.l #8,d7
  306.   EOR.l d6,d2
  307.   EOR.l d7,d3
  308.  
  309.   MOVE.l  d2,d6     ; Swap 1x2, part 1
  310.   MOVE.l  d3,d7
  311.   LSR.l #1,d6
  312.   LSR.l #1,d7
  313.   EOR.l d0,d6
  314.   EOR.l d1,d7
  315.   AND.l #$55555555,d6
  316.   AND.l #$55555555,d7
  317.   EOR.l d6,d0
  318.   EOR.l d7,d1
  319.   LSL.l #1,d6
  320.   LSL.l #1,d7
  321.   EOR.l d6,d2
  322.   EOR.l d7,d3
  323.  
  324.   MOVE.l  d0,(a1)
  325.   SUB.l #c2pBPLSIZE*4,a1
  326.  
  327.   MOVE.l  a5,d6
  328.   MOVE.l  a6,d7
  329.   MOVE.l  d2,a3
  330.   MOVE.l  d3,a4
  331.  
  332.   MOVE.l  d5,d2     ; Swap 4x1, part 2
  333.   MOVE.l  d7,d3
  334.   LSR.l #4,d2
  335.   LSR.l #4,d3
  336.   EOR.l d4,d2
  337.   EOR.l d6,d3
  338.   AND.l #$0f0f0f0f,d2
  339.   AND.l #$0f0f0f0f,d3
  340.   EOR.l d2,d4
  341.   EOR.l d3,d6
  342.  
  343.   MOVE.l  d1,(a1)
  344.   ADD.l #c2pBPLSIZE*3,a1
  345.  
  346.   LSL.l #4,d2
  347.   LSL.l #4,d3
  348.   EOR.l d2,d5
  349.   EOR.l d3,d7
  350.  
  351.   MOVE.l  d4,d2     ; Swap 8x2, part 2
  352.   MOVE.l  d5,d3
  353.   LSR.l #8,d2
  354.   LSR.l #8,d3
  355.   EOR.l d6,d2
  356.   EOR.l d7,d3
  357.   AND.l #$00ff00ff,d2
  358.   AND.l #$00ff00ff,d3
  359.   EOR.l d2,d6
  360.   EOR.l d3,d7
  361.  
  362.   MOVE.l  a3,(a1)
  363.   SUB.l #c2pBPLSIZE*4,a1
  364.  
  365.   LSL.l #8,d2
  366.   LSL.l #8,d3
  367.   EOR.l d2,d4
  368.   EOR.l d3,d5
  369.  
  370.   MOVE.l  d4,d2     ; Swap 1x2, part 2
  371.   MOVE.l  d5,d3
  372.   LSR.l #1,d2
  373.   LSR.l #1,d3
  374.   EOR.l d6,d2
  375.   EOR.l d7,d3
  376.   AND.l #$55555555,d2
  377.   AND.l #$55555555,d3
  378.  
  379.   MOVE.l  a4,(a1)
  380.   ADD.l #c2pBPLSIZE*3,a1
  381.  
  382.   EOR.l d2,d6
  383.   EOR.l d3,d7
  384.   LSL.l #1,d2
  385.   LSL.l #1,d3
  386.   EOR.l d2,d4
  387.   EOR.l d3,d5
  388.  
  389.   MOVE.l  d4,a3
  390.   MOVE.l  d5,a4
  391.  
  392.   CMP.l a0,a2
  393.   BNE _x
  394.  
  395.   MOVE.l  d6,(a1)
  396.   SUB.l #c2pBPLSIZE*4,a1
  397.   MOVE.l  d7,(a1)
  398.   ADD.l #c2pBPLSIZE*3,a1
  399.   MOVE.l  a3,(a1)
  400.   SUB.l #c2pBPLSIZE*4,a1
  401.   MOVE.l  a4,(a1)
  402.  
  403. _none
  404.   MOVE.l  stackstore(pc),a7
  405.   MOVEM.l (a7)+,a3-a6
  406. AsmExit
  407.  
  408. Even4
  409. stackstore: Dc.l 0
  410. c2p1x1_8_c5_040_scroffs: Dc.l 0
  411. c2p1x1_8_c5_040_pixels: Dc.l 0
  412. End Statement
  413.  
  414.  
  415.  
  416.  
  417.  
  418. .blitzprogram
  419. ; Setup
  420. InitBank 0,(#scrwidth*#scrheight)+1000,2|65536 ; Chipram planar buffer
  421. CludgeBitMap 0,#scrwidth,#scrheight,8,Bank(0)
  422. InitPalette 0,256
  423. For c=0 To 255
  424.   AGAPalRGB 0,c,Rnd(c),Rnd(c),Rnd(c)
  425. Next c
  426. AGAPalRGB 0,0,0,0,0
  427. Screen 0,0,0,#scrwidth,#scrheight,8,0,"c2p test",0,0,0
  428. Use Palette 0
  429. VWait 50
  430. baseaddress1.l=AllocMem(#scrwidth*#scrheight,$10000) ; Fastram chunky buffer
  431.  
  432. ; Put something into the chunky buffer so we can see it working
  433. GetReg a0,baseaddress1
  434. MOVE.l  #0,d0
  435. MOVE.l  #screensize-1,d1
  436. cloop
  437.   MOVE.b  d0,(a0)+
  438.   ADDQ.l  #1,d0
  439.   SUBQ.l  #1,d1
  440.   TST.l   d1
  441.   BLT     done
  442.   BRA     cloop
  443. done
  444.  
  445. ; Do the c2p test
  446. c2p040init{#scrwidth,#scrheight}
  447. VWait 20
  448. Forbid_
  449. VWait
  450. ResetTimer
  451. For time=1 To 800
  452.   c2p040{baseaddress1,Bank(0)} ; Convert chunky to planar
  453. Next time
  454. t=Ticks
  455. VWait 2 : Permit_
  456. VWait 20
  457. FindScreen 0
  458. Window 0,0,11,640,100,0,"Test results for c2p",0,0
  459. WindowOutput 0
  460. NPrint "Routine performed @ ",50/(t/800),"fps - ",t," ticks"
  461. NPrint " "
  462. NPrint "Press mousebutton..."
  463. Free Screen 0
  464. MouseWait
  465. Free Window 0
  466. End
  467.  
  468.